package com.java.base.exercise.jvm;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @Author RenPu
 * @Date 2021/10/11 17:15
 * @Version 1.0
 * @Description: 本机直接内存溢出
 * DirectMemory容量，可以通过-XX:MaxDirectMemorySize指定，默认和heap（堆的-Xmx最大值一致）
 * Unsafe实例进行内存分布，Unsafe类的getUnsafe()方法限制了，只有引导类加载器才会返回实例，也就是设计者希望
 * 只有rt.jar中的类具有使用Unsafe的功能
 * 参数：VM Args:-Xmx20M-XX:MaxDirectMemorySize=10M
 **/
public class DirectMemoryOOM {

    private static final int MB = 1024 * 1024;

    public static void main(String[] args) throws IllegalAccessException {
        Field declaredField = Unsafe.class.getDeclaredFields()[0];
        declaredField.setAccessible(true);
        Unsafe unsafe = (Unsafe) declaredField.get(null);
        while (true) {
            unsafe.allocateMemory(MB);    //真正申请分配内存的方法，
            // DirectByteBuffer（堆外内存）并没有真正向系统申请分配内存，而是通过核算出分配结果直接【抛出异常

        }
    }


}
